#include "MainWindow.h"
#include "ui_MainWindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    initIps();//初始化ip
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::initIps()
{
    //1.获取本地主机的主机名
    QString name = QHostInfo::localHostName();
    //2.根据主机名 获取网络信息
    QHostInfo info = QHostInfo::fromName(name);
    //3.只要信息里的地址
    QList<QHostAddress> addr = info.addresses();
    //4.筛选  只要ipv4
    for(auto iter = addr.begin();iter != addr.end();iter++)
    {
        //对比
        if(iter->protocol() == QAbstractSocket::IPv4Protocol)
        {
             //5.显示到combobox上
            ui->comboBox->addItem(iter->toString());
        }
    }


}

//选择要下载的文件目录
void MainWindow::on_pushButton_file_clicked()
{
    //1.自由的选择一个文件夹
    path = QFileDialog::getExistingDirectory(this,"","D:/Opencv");
    //2.提取文件夹下的所有文件（拿到所有的文件名 和文件大小 发给客户端）
    QDir dir(path);//根据路径构建目录类的对象
    //判断目录存在不存在
    if(!dir.exists())
    {
        //创建
        dir.mkpath(path);
    }
    //提取目录下文件
    //QFileInfoList 包含文件的信息  之前的entryList返回值只有名字QStringList
    QFileInfoList list = dir.entryInfoList(QDir::Files);//拿到所有的文件及文件的信息

    //迭代器遍历 把所有的文件名字和大小 拼成一个大的字符串 发给客户端
    //文件和文件之间 用" ;"分隔  文件和大小之间用","分隔
    for(auto iter = list.begin();iter != list.end();iter++)
    {
        //*iter类型？QFileInfo    将int转成QString
       socket_fileNames += iter->fileName()+","+QString::number(iter->size())+";";

    }
    qDebug()<<"要发给客户端的字符串："<<socket_fileNames;

}
//开启服务器
void MainWindow::on_pushButton_start_clicked()
{
    server = new QTcpServer(this);
    //监听
    server->listen(QHostAddress::Any,12345);

    //关联newConnection信号
    connect(server,&QTcpServer::newConnection,this,&MainWindow::slot_newConnection);

    //开启服务器之后 设置两个按钮为不可点击的状态
    ui->pushButton_file->setEnabled(false);
    ui->pushButton_start->setEnabled(false);
}

void MainWindow::slot_newConnection()
{
    qDebug()<<"客户端连接成功";
    //1.获取客户端的套接字 client_socket
    client_socket = server->nextPendingConnection();
    //显示客户端ip
    QString client_ip = client_socket->peerAddress().toString().mid(7);
    ui->textBrowser->append("客户端"+client_ip+"连接成功");

    //关联信号与槽
    connect(client_socket,&QTcpSocket::readyRead,this,&MainWindow::slot_readyRead);

    //2.将大字符串（文件名和大小）发给客户端
    client_socket->write(socket_fileNames.toUtf8());

}
//接收到客户端消息的槽函数
void MainWindow::slot_readyRead()
{
    //接收到客户端发来的文件名称
    QByteArray arr = client_socket->readAll();
    QString fileName = QString::fromUtf8(arr);
    qDebug()<<"客户端要下载的文件名称： "<<fileName;
    //判断当前文件是否存在
    QFile file(path+"/"+fileName);
    if(!file.exists())
    {
        //不存在 给客户端回传error
        QString msg = "error";
        client_socket->write(msg.toUtf8());
        return;
    }

    //存在：循环读取并给客户端发送
    if(!file.open(QIODevice::ReadOnly))
    {
        //打开失败
        QString msg = "open error";
        client_socket->write(msg.toUtf8());
        return;
    }
    ui->textBrowser->append(fileName+"开始传输");
    //循环读取
    while (!file.atEnd())
    {
        //每次读取5KB
        QByteArray arr = file.read(5*1024);
        //通过套接字发给客户端
        client_socket->write(arr);
        //这次内容发完再去发下一次内容
        client_socket->waitForBytesWritten();
    }
    ui->textBrowser->append(fileName+"传输完毕");
    //关闭
    client_socket->close();
    file.close();
}
